package models;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Transient;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import play.data.validation.Required;
import play.db.jpa.Model;

@Entity
public class Presupuesto extends Model {

	private Date date;
	private Date deliveryDate;
	
	@Required
	@Transient
	public String fecha;
	
	@Transient
	public String fechaEntrega;
	
	@Required
	@ManyToOne
	@JoinColumn(name="idCliente")
	public Cliente cliente;
	public String condicionPago;
	
	public String observaciones;
	@ManyToOne
	@JoinColumn(name="idEstado")
	public EstadoPresupuesto estado;
	
	@OneToMany
	@Cascade(CascadeType.ALL)
	@JoinColumn(name="idPresupuesto")
	public List<Producto> productos;
	
	@OneToMany
	@JoinColumn(name="idPresupuesto")
	public List<Anticipo> anticipos;
	
	@Transient
	public float precio;
	@Transient
	public float iva;
	@Transient
	public float precioFinal;
	
	public float getPrecio() {
		return calcularPrecio();
	}

	public float getIva() {
		return calcularIVA();
	}

	public float getPrecioFinal() {
		return calcularPrecioFinal();
	}

	public String getFecha() {
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
		return dateFormat.format(date);
	}
	
	public void setFecha(String fecha) {
		this.date = convertString(fecha);
	}
	
	public String getFechaEntrega() {
		if(fechaEntrega!=null && fechaEntrega.length() > 0)
			return "";
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
		return dateFormat.format(deliveryDate);
	}
	
	public void setFechaEntrega(String fechaEntrega) {
		if(fechaEntrega!=null && fechaEntrega.length() > 0)
			this.deliveryDate = convertString(fechaEntrega);
	}
	
	private float calcularPrecio(){
		float total=0;
		for(Producto p : productos){
			total += p.calcularPrecio();
		}
		return total;
	}
	
	private float calcularIVA(){
		return calcularPrecio() * cliente.posicionIVA.valor / 100;
	}
	
	private float calcularPrecioFinal(){
		float total=0;
		for(Producto p : productos){
			total += p.calcularPrecio();
		}
		return total * (1 + cliente.posicionIVA.valor / 100);
	}
	
	private Date convertString(String s){
		Date date = new Date();
		try {
			date = new SimpleDateFormat("dd-MM-yyyy").parse(s);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
}